<?
require_once dirname(__FILE__) . '/cbase.php';

class CAutenticacao extends CBase {

    private $ent_usuario;
    private $campo_id;
    private $campo_login;
    private $campo_senha;
    private $campo_email;
    private $link_inicial;

    public function __construct() {
        parent::__construct();

        $this->ent_usuario = 'Usuario';
        $this->campo_id = 'us_id';
        $this->campo_login = 'us_login';
        $this->campo_senha = 'us_senha';
        $this->campo_email = 'us_email';
        $this->link_inicial = site_url() . '/cusuario/';

        $this->iniciaSessao();
    }


    public function index() {
        redirect('cautenticacao/formLogin', 'refresh');
    }


    /**
     * Codifica email com id para enviar por email
     */
    private function criptografarUsuario($id, $login) {
        $this->load->library('encrypt');
        $valor = date("His") . " - $id - $login";
        $valor = $this->encrypt->encode($valor);
        $valor = urlencode($valor);

        return $valor;
    }


    /**
     * @return string email: email que foi solicitado a alteracao de senha
     */
    private function descriptografarUsuario($valor) {
        $this->load->library('encrypt');

        $valor = urldecode($valor);		
        $valor = $this->encrypt->decode($valor);

        $tmp = explode(' - ', $valor);
        $r['id'] = $tmp[1];
        $r['login'] = $tmp[2];

        return $r;
    }

    /**   
     * recupera todos os perfis do usuario
     *              
     * @param int $us_id 
     * 
     * @return array: todos os perfis
     */ 
    private function _recuperarPerfis($us_id) {
        $perfil = null;

        // seleciona todos os perfil de um determinado usuario
        $up = new UsuarioPerfil();
        $up->us_id = $us_id;
        $perfis = $up->recuperar();
        foreach ($perfis as $tmp) {
            $perfil_tmp = new Perfil();
            $perfil_tmp->pe_id = $tmp->pe_id;
            $perfil_tmp_r = $perfil_tmp->recuperar();
            $perfil[$tmp->pe_id] = $perfil_tmp_r[0]->pe_nome;
        }

        return $perfil;
    }

    private function _recuperarLinkInicial($pe_id) {
        $obj = new Perfil();
        $obj->pe_id = $pe_id;
        $r_obj = $obj->recuperar();

        return $r_obj[0]->pe_link_inicial;
    }

    /**
     * recupera todos os controlers que o usuario pode acessar
     *
     * @param array $perfis
     *
     * @return array: todos os controladores
     */
    private function _recuperarAcessoControlador($perfis) {
        $controlador = null;

        // seleciona todos os perfil de um determinado usuario
        $up = new Controlador();
        $r1 = $up->recuperarControladorPorPerfil($perfis);
        foreach ($r1 as $tmp) {
            $controlador[] = $tmp->co_caminho;
        }

        return $controlador;
    }

    /**
     * gera senha aleatoria
     */
    private function geraSenha($tamanho = 8, $maiusculas = true, $numeros = true, $simbolos = false) {
        $lmin = 'abcdefghijklmnopqrstuvwxyz';
        $lmai = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $num = '1234567890';
        $simb = '!@#$%*-';
        $retorno = '';
        $caracteres = '';

        $caracteres .= $lmin;
        if ($maiusculas) $caracteres .= $lmai;
        if ($numeros) $caracteres .= $num;
        if ($simbolos) $caracteres .= $simb;

        $len = strlen($caracteres);
        for ($n = 1; $n <= $tamanho; $n++) {
            $rand = mt_rand(1, $len);
            $retorno .= $caracteres[$rand-1];
        }
        return $retorno;
    }


    public function formLogin($invalida = false) {

        $this->lang->load('autenticacao');
        $dados['mensagem'] = $invalida ? $this->lang->line('autenticacao_senha_incorreta') : '';

        if (!isset($_SESSION['usuario'])) {
            $this->template->set_template('autenticacao');
            $this->template->write_view('conteudo', 'autenticacao/login', $dados);
            $this->template->render();
        }
    }


    public function login() {
        $usuario = new $this->ent_usuario;
        $usuario->{$this->campo_login} = $this->input->post('login');
        $usuario->{$this->campo_senha} = md5($this->input->post('senha'));
        $usuario->us_status = 1;
        $r = $usuario->recuperar();

        // senha correta
        if (count($r) == 1) {
            $_SESSION['usuario'] = $r[0];
            $_SESSION['usuario']->perfis = $this->_recuperarPerfis($r[0]->us_id);
            $keys = array_keys($_SESSION['usuario']->perfis);
            $_SESSION['usuario']->controlador_autorizado = $this->_recuperarAcessoControlador($keys);
            $link_inicial = $this->_recuperarLinkInicial($keys[0]);
            $link_inicial = $link_inicial ? $link_inicial : $this->link_inicial;
            $redireciona = isset($_SESSION['url']) ? $_SESSION['url'] : $link_inicial;
        }

        // senha incorreta
        else {
            $redireciona = site_url() . '/cautenticacao/formLogin/true';
        }

        redirect($redireciona, 'refresh');
    }


    public function formEsqueciSenha() {
        $this->template->set_template('autenticacao');
        $this->template->add_js(js_url() . 'autenticacao/esqueci_senha.js');
        $this->template->write_view('conteudo', 'autenticacao/esqueci_senha');
        $this->template->render();
    }


    /**
     * @return boolean true: verifica se login esta cadastrado
     */
    public function ajaxValidarCadastrado() {
        $usuario = new $this->ent_usuario();
        $usuario->{$this->campo_login} = $this->input->post('login');

        $r = $usuario->recuperar();

        echo (count($r) == 1) ? 'true' : 'false';
    }





    /**
     * @return boolean true: email enviado
     */
    public function ajaxEmailCodigo() {
        $usuario = new $this->ent_usuario();
        $usuario->{$this->campo_login} = $this->input->post('login');
        $r = $usuario->recuperar();

        if (count($r) == 1) {
            $r = $r[0];
            $this->load->library('email');
            $this->lang->load('email');

            $email_de = $this->lang->line('email_de');
            $this->email->from($email_de['email'], $email_de['nome']);

            $link = site_url() . '/cautenticacao/alterarSenhaEmail/' . $this->criptografarUsuario($r->{$this->campo_id}, $r->{$this->campo_login});
            $substitui = array('%&link&%' => $link);
            $this->email->to($r->{$this->campo_email});
            $this->email->subject(html_entity_decode($this->lang->line('email_assunto_esqueci_senha_codigo')));
            $this->email->message(strtr($this->lang->line('email_corpo_esqueci_senha_codigo'), $substitui));

            $this->email->send();

            echo 'true';
        }
    }


    /**
     * utililizado no link do email recuperar senha
     */
    public function alterarSenhaEmail($codigo) {
        if ($codigo) {
            $email_usuario = $this->descriptografarUsuario($codigo);

            $usuario = new $this->ent_usuario();
            $usuario->{$this->campo_id} = $email_usuario['id'];
            $tmp_usuario = $usuario->recuperar();

            $usuario = new $this->ent_usuario();
            $usuario->setFrom($tmp_usuario[0]);
            $usuario->{$this->campo_id} = $email_usuario['id'];
            $usuario->{$this->campo_login} = $email_usuario['login'];
            $nova_senha = $this->geraSenha();
            $usuario->{$this->campo_senha} = md5($nova_senha);
            $usuario->alterar();

            //envia email
            $this->load->library('email');
            $this->lang->load('email');
            $this->lang->load('autenticacao');

            $email_de = $this->lang->line('email_de');
            $this->email->from($email_de['email'], $email_de['nome']);

            unset($usuario);
            $usuario = new $this->ent_usuario();
            $usuario->{$this->campo_id} = $email_usuario['id'];
            $usu = $usuario->recuperar();

            $this->email->to($usu[0]->{$this->campo_email});
            $substitui = array('%&nova_senha&%' => $nova_senha);
            $this->email->subject(html_entity_decode($this->lang->line('email_assunto_esqueci_senha')));
            $this->email->message(strtr($this->lang->line('email_corpo_esqueci_senha'), $substitui));
            $this->email->send();

            $dados['mensagem'] = $this->lang->line('autenticacao_senha_alterada_email');

            $this->template->set_template('autenticacao');
            $this->template->write_view('conteudo', 'autenticacao/senha_alterada', $dados);
            $this->template->render();
        }
    }


    public function formAlterarSenha() {
        $dados['email'] = $_SESSION['usuario']->{$this->campo_email};

        $this->template->add_js(js_url() . 'autenticacao/alterar_senha.js');
        $this->template->write_view('conteudo', 'autenticacao/alterar_senha', $dados);
        $this->template->render();
    }


    public function alterarSenha() {
        $senha_atual = $this->input->post('senha');
        $nova_senha = $this->input->post('senha_nova');

        if ($nova_senha && $senha_atual) {

            $this->lang->load('autenticacao');

            $usuario = new $this->ent_usuario();
            $usuario->{$this->campo_id} = $_SESSION['usuario']->{$this->campo_id};
            $usuario->{$this->campo_senha} = md5($senha_atual);
            $r = $usuario->recuperar();

            if (count($r) == 1) {
                $us = new $this->ent_usuario();
                $us->{$this->campo_id} = $_SESSION['usuario']->{$this->campo_id};
                $tmp_us = $us->recuperar();

                $us = new $this->ent_usuario();
                $us->setFrom($tmp_us[0]);
                $us->{$this->campo_id} = $_SESSION['usuario']->{$this->campo_id};
                $us->{$this->campo_senha} = md5($nova_senha);
                $us->alterar();

                $dados['mensagem'] = $this->lang->line('autenticacao_senha_alterada');
            }
            else
                $dados['mensagem'] = $this->lang->line('autenticacao_senha_nao_confere');


            $this->template->write_view('conteudo', 'autenticacao/senha_alterada', $dados);
            $this->template->render();
        }
    }


    public function sair() {
        session_destroy();

        redirect('cautenticacao/index', 'refresh');
    }
}
